import re

# re.match(pattern, string, flags=0)
# pattern	匹配的正则表达式
# string	要匹配的字符串
# flags	标志位，用于控制正则表达式的匹配方式，如：是否区分大小写，多行匹配
# 匹配成功re.match方法返回一个匹配的对象，否则返回None
# 可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式



# .表示一个字符
# p = re.compile('...')
p = re.compile('.{3}')
print(p.match('bat'))           # <re.Match object; span=(0, 3), match='bat'>

p = re.compile('....-..-..')
print(p.match('2018-05-20'))    # <re.Match object; span=(0, 10), match='2018-05-20'>

# r表示不转义，\d表示一个数字，+表示多个数字，()表示分组，分组后可以通过group取到
p = re.compile(r'(\d+)-(\d+)-(\d+)')
print(p.match('2018-05-20'))    # <re.Match object; span=(0, 10), match='2018-05-20'>
print(p.match('2018-5-20'))     # <re.Match object; span=(0, 9), match='2018-5-20'>
print(p.match('2018-05-20').group())    # 2018-05-20
print(p.match('2018-05-20').groups())   # ('2018', '05', '20')
print(p.match('2018-05-20').group(0))   # 2018-05-20
print(p.match('2018-05-20').group(1))   # 2018
print(p.match('2018-05-20').group(2))   # 05
print(p.match('2018-05-20').group(3))   # 20

# match需要完全匹配，而search如果不匹配，会继续搜索
print(p.match('a2018-05-20f'))      # None
print(p.search('a2018-05-20f'))     # <re.Match object; span=(1, 11), match='2018-05-20'>
print(p.search('a2018b-c05d-e20f'))         # None

# findall会返回一个list，包含所有的匹配结果
print(p.findall('2018-05-20 2018-12-25'))   # [('2018', '05', '20'), ('2018', '12', '25')]

# sub用来替换字符串
p = '+86-134-1021-7009 # a phone number'
print(p)
# 首先去掉注释
p = re.sub(r'#.*$', '', p)  # +86-134-1021-7009
print(p)
# 再去掉非数字
p = re.sub(r'\D', '', p)
print(p)                    # 8613410217009

